package pedidos.modelo.pruebas;

import java.util.Date;

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;

import pedidos.modelo.*;

@Stateless
@TransactionManagement( TransactionManagementType.BEAN )
public class DatosPrueba {


	// --

	@PersistenceContext( unitName="app_PU" )
	EntityManager 	manager;
	
	@Resource
	UserTransaction tx;
	
	EntityTransaction etx;
	
	public void initDB() {
		if ( manager == null ) {
			EntityManagerFactory factory = Persistence.createEntityManagerFactory("local_PU");
			manager = factory.createEntityManager();
			etx = manager.getTransaction();
		}
	}
	
	private void beginTx() throws Exception {
		if ( tx != null ){
			tx.begin();
		} else {
			etx.begin();
		}
	}
	
	private void commitTx() throws Exception {
		if ( tx != null ){
			tx.commit();
		} else {
			etx.commit();
		}		
	}
	
	
	// --
	
	public void borrarDatosPrueba() throws Exception {

		initDB();

		beginTx();
		
		manager.createQuery( "DELETE FROM Factura" ).executeUpdate();
		manager.createQuery( "DELETE FROM ItemPedido" ).executeUpdate();
		manager.createQuery( "DELETE FROM Pedido" ).executeUpdate();
		
		commitTx();
		
		beginTx();
		
		manager.createQuery( "DELETE FROM Cliente" ).executeUpdate();
		manager.createQuery( "DELETE FROM Producto" ).executeUpdate();
		
		commitTx();
		
	}

	public void crearCliente( Long nit, String nombre, String email ) throws Exception {

		initDB();		
		beginTx();

		Cliente cliente = new Cliente();
		
		cliente.setId(nit);
		cliente.setNit(nit);
		cliente.setNombre(nombre);
		cliente.setEmail(email);
		manager.persist( cliente );
		
		commitTx();
		
	}
	
	public void crearProducto( Long codigoBarras, String nombre, Double precio ) throws Exception {

		initDB();
		beginTx();

		Producto producto = new Producto();
		producto.setId(codigoBarras);
		producto.setCodigoBarras(codigoBarras);
		producto.setNombre(nombre);
		producto.setPrecioActual(precio);
		
		manager.persist( producto );
		
		commitTx();
		
	}
	

	public void crearPedido( Long id, Long idCliente, Date fecha, Double precioTotal ) throws Exception  {

		initDB();
		beginTx();

		Cliente cliente = manager.find( Cliente.class, idCliente );
		
		Pedido pedido = new Pedido();
		pedido.setId( id );
		pedido.setCliente(cliente);
		pedido.setFecha(fecha);
		pedido.setPrecioTotal(precioTotal);
		
		manager.persist( pedido );
		
		commitTx();
		
	}
	
	
	public void crearItem( Long idPedido, Long idProducto, Integer cantidad, Double precioTotal ) throws Exception  {
		
		initDB();
		beginTx();

		Pedido pedido = manager.find( Pedido.class, idPedido);
		Producto producto = manager.find( Producto.class, idProducto);
		
		ItemPedido item = new ItemPedido();
		item.setPedido(pedido);
		pedido.getItems().add(item);
		item.setProducto(producto);
		producto.getItems().add(item);
		
		item.setCantidad(cantidad);
		item.setPrecioTotal(precioTotal);
		
		manager.persist( item );
		
		commitTx();
		
	}
	
	public void crearFactura( Long idPedido, Date fecha, Date fechaVencimiento, Date fechaPago ) throws Exception { 
	
		initDB();
		beginTx();

		Pedido pedido = manager.find( Pedido.class, idPedido);

		Factura factura = new Factura();
		factura.setPedido(pedido);
		pedido.setFactura(factura);
		
		factura.setFecha(fecha);
		factura.setFechaVencimiento(fechaVencimiento);
		factura.setFechaPago(fechaPago);
		
		manager.persist( factura );
		
		commitTx();
		
	}
	

	public void crearDatosPrueba() throws Exception {

		initDB();
		
		crearCliente( 1L, "homero", "homero@springfield.com" );	
		crearCliente( 2L, "bruce", "bruce@gotham.com" );
		crearCliente( 3L, "clark", "clark@metropolis.com" );
		
		crearProducto( 101L, 	"gaseosa", 		2000.0 );
		crearProducto( 102L, 	"pandebono",	3000.0 );
		crearProducto( 103L, 	"bu�uelo", 		2000.0 );
		crearProducto( 104L, 	"cafe", 		1500.0 );
		crearProducto( 105L, 	"cafe latte",	2000.0 );
		crearProducto( 106L, 	"capuccino",	2500.0 );
		
		crearPedido( 10L, 1L, new Date(), 15000.0 );
		crearItem( 10L, 101L, 5, 10000.0 );
		crearItem( 10L, 102L, 1,  3000.0 );
		crearItem( 10L, 103L, 1,  2000.0 );
		crearFactura( 10L, new Date(), new Date(), new Date());
		
		crearPedido( 11L, 1L, new Date(), 15000.0 );
		crearItem( 11L, 101L, 5, 10000.0 );
		crearItem( 11L, 102L, 1,  3000.0 );
		crearItem( 11L, 103L, 1,  2000.0 );
		crearFactura( 11L, new Date(), new Date(), null);

		crearPedido( 12L, 1L, new Date(), 15000.0 );
		crearItem( 12L, 101L, 5, 10000.0 );
		crearItem( 12L, 102L, 1,  3000.0 );
		crearItem( 12L, 103L, 1,  2000.0 );

		crearPedido( 13L, 2L, new Date(), 10000.0 );
		crearItem( 13L, 101L, 5, 10000.0 );

		crearPedido( 14L, 2L, new Date(), 15000.0 );
		crearItem( 14L, 101L, 5, 10000.0 );
		crearItem( 14L, 102L, 1,  3000.0 );
		crearItem( 14L, 103L, 1,  2000.0 );

		crearPedido( 15L, 2L, new Date(), 10500.0 );
		crearItem( 15L, 104L, 4,  6000.0 );
		crearItem( 15L, 105L, 1,  2000.0 );
		crearItem( 15L, 106L, 1,  2500.0 );
	
	}	
	
}
